package solutions.ferpa.ztest.ent;

import java.sql.*;
import java.util.ArrayList;
import br.com.telescope.adsrt.dom.*;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.t2.exception.Severity;

/**
 * API de persistência de dados da entidade FUNCOES_SISTEMAS
 * @author Gerado pelo Telescope
 */
public class EntFuncoesSistemas extends Entity {
    
    public final static String ENTITY_NAME = "RTSYSINF.FUNCOES_SISTEMAS";
    public final static String TABLE_NAME = "FUNCOES_SISTEMAS";
    
    // <editor-fold defaultstate="collapsed" desc="Contrutores e inicializacao">
    /**
     * Construtores
     */
    public EntFuncoesSistemas() {
        super();
        initialize();
    }
    
    public EntFuncoesSistemas(BaseRuntime ctx) {
        super();
        initialize(ctx);
    }
    
    @Override
    public String getPrimaryKeyColumn() {
        return "ID";
    }
    
    @Override
    public void initialize(BaseRuntime ctx) {
        super.initialize(ctx);
        initialize();
    }
    
    public void initialize() {
        aId = new DomId(this,"ID", "Id"); 
        aId.setRequired(true);
        oId = new DomId();
        aFuncaoSistema = new DomUpper(this,"FUNCAO_SISTEMA", "Função"); 
        aFuncaoSistema.setRequired(true);
        aFuncaoSistema.setSize(40);
        oFuncaoSistema = new DomUpper();
        aTitulo = new DomText(this,"TITULO", "Título"); 
        aTitulo.setRequired(true);
        aTitulo.setSize(120);
        oTitulo = new DomText();
        aDescricao = new DomTextLong(this,"DESCRICAO", "Descrição"); 
        oDescricao = new DomTextLong();
        ressetModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributos da entidade">
    
    // Id
    private DomId aId;
    private DomId oId;
    
    // Função
    private DomUpper aFuncaoSistema;
    private DomUpper oFuncaoSistema;
    
    // Título
    private DomText aTitulo;
    private DomText oTitulo;
    
    // Descrição
    private DomTextLong aDescricao;
    private DomTextLong oDescricao;
    
    // <editor-fold defaultstate="collapsed" desc="Atributo ID">
    
    public EntFuncoesSistemas id(Long value) {
        setId(value);
        return this;
    }
    
    public void setId(DomId value) {
        if (value == null || value.isNull()) {
            nullifyId();
        } else {
            aId.setValue(value.getValue());
            if (aId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setId(String value) {
        if (value == null) {
            nullifyId();
        } else {
            aId.setValue(value);
            if (aId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setId(Long value) {
        aId.setValue(value);
        if (aId.isModified()) {
            setModified(true);
        }
    }
    
    public void setId(Object value) {
        aId.setValue(value);
        if (aId.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyId() {
        if (!aId.isNull()) {
            aId.setNull(true);
            setModified(true);
        }
    }
    
    public DomId getId() {
        return aId;
    }
    
    public DomId oldId() {
        return oId;
    }
    
    public Long valueOfId() {
        return aId.getValue();
    }
    
    public boolean isIdModified() {
        return aId.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo FUNCAO_SISTEMA">
    
    public EntFuncoesSistemas funcaoSistema(String value) {
        setFuncaoSistema(value);
        return this;
    }
    
    public void setFuncaoSistema(DomUpper value) {
        if (value == null || value.isNull()) {
            nullifyFuncaoSistema();
        } else {
            aFuncaoSistema.setValue(value.getValue());
            if (aFuncaoSistema.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setFuncaoSistema(String value) {
        if (value == null) {
            nullifyFuncaoSistema();
        } else {
            aFuncaoSistema.setValue(value);
            if (aFuncaoSistema.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setFuncaoSistema(Object value) {
        aFuncaoSistema.setValue(value);
        if (aFuncaoSistema.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyFuncaoSistema() {
        if (!aFuncaoSistema.isNull()) {
            aFuncaoSistema.setNull(true);
            setModified(true);
        }
    }
    
    public DomUpper getFuncaoSistema() {
        return aFuncaoSistema;
    }
    
    public DomUpper oldFuncaoSistema() {
        return oFuncaoSistema;
    }
    
    public String valueOfFuncaoSistema() {
        return aFuncaoSistema.getValue();
    }
    
    public boolean isFuncaoSistemaModified() {
        return aFuncaoSistema.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo TITULO">
    
    public EntFuncoesSistemas titulo(String value) {
        setTitulo(value);
        return this;
    }
    
    public void setTitulo(DomText value) {
        if (value == null || value.isNull()) {
            nullifyTitulo();
        } else {
            aTitulo.setValue(value.getValue());
            if (aTitulo.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setTitulo(String value) {
        if (value == null) {
            nullifyTitulo();
        } else {
            aTitulo.setValue(value);
            if (aTitulo.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setTitulo(Object value) {
        aTitulo.setValue(value);
        if (aTitulo.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyTitulo() {
        if (!aTitulo.isNull()) {
            aTitulo.setNull(true);
            setModified(true);
        }
    }
    
    public DomText getTitulo() {
        return aTitulo;
    }
    
    public DomText oldTitulo() {
        return oTitulo;
    }
    
    public String valueOfTitulo() {
        return aTitulo.getValue();
    }
    
    public boolean isTituloModified() {
        return aTitulo.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo DESCRICAO">
    
    public EntFuncoesSistemas descricao(String value) {
        setDescricao(value);
        return this;
    }
    
    public void setDescricao(DomTextLong value) {
        if (value == null || value.isNull()) {
            nullifyDescricao();
        } else {
            aDescricao.setValue(value.getValue());
            if (aDescricao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setDescricao(String value) {
        if (value == null) {
            nullifyDescricao();
        } else {
            aDescricao.setValue(value);
            if (aDescricao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setDescricao(Object value) {
        aDescricao.setValue(value);
        if (aDescricao.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyDescricao() {
        if (!aDescricao.isNull()) {
            aDescricao.setNull(true);
            setModified(true);
        }
    }
    
    public DomTextLong getDescricao() {
        return aDescricao;
    }
    
    public DomTextLong oldDescricao() {
        return oDescricao;
    }
    
    public String valueOfDescricao() {
        return aDescricao.getValue();
    }
    
    public boolean isDescricaoModified() {
        return aDescricao.isModified();
    }
    // </editor-fold>
    // </editor-fold>
    
    @Override
    protected void processDeleteCascade() throws AdsException {
        // Delete cascade RTSYSINF.INTERFACES_FUNCOES.FK_FUNCAO_SISTEMA
        {
            EntInterfacesFuncoes interfacesFuncoes = new EntInterfacesFuncoes(ctx);
            interfacesFuncoes.del("select id from INTERFACES_FUNCOES where FUNCAO_ID = " + valueOfId());
        }
        // Delete cascade RTAUTH.FUNCOES_USUARIOS.FK_FUNUSU_FUNCAO
        {
            EntFuncoesUsuarios funcoesUsuarios = new EntFuncoesUsuarios(ctx);
            funcoesUsuarios.del("select id from FUNCOES_USUARIOS where FUNCAO_ID = " + valueOfId());
        }
        // Delete cascade RTSYSINF.OPERACOES_FUNCOES.FK_FUNCAO_OPERACAO
        {
            EntOperacoesFuncoes operacoesFuncoes = new EntOperacoesFuncoes(ctx);
            operacoesFuncoes.del("select id from OPERACOES_FUNCOES where FUNCAO_ID = " + valueOfId());
        }
    }
    
    // <editor-fold defaultstate="collapsed" desc="getErrors">
    /**
     * Traduz um erro recebido do banco de dados para um AdsException
     */
    @Override
    public AdsException getErrors(String errorMsg, int transaction) {
        AdsException e;
        String msg = errorMsg.toUpperCase();
        
        if (transaction == DELETE_TRANSACTION) {
            if (msg.indexOf("FK_SISMON_FUNCAO_MONITORAMENTO") >= 0) {
                e = new AdsException("SISMON.SISTEMAS_MONITORADOS.FK_SISMON_FUNCAO_MONITORAMENTO.RESTRICTED", 
                        Severity.ERROR,
                        "Não pode excluir porque existem Sistemas monitorados fazendo referencia para este registro! (FK_SISMON_FUNCAO_MONITORAMENTO)");
                return e;
            } else if (msg.indexOf("FK_SISMON_ACESSO_RESTRITO") >= 0) {
                e = new AdsException("SISMON.SISTEMAS_MONITORADOS.FK_SISMON_ACESSO_RESTRITO.RESTRICTED", 
                        Severity.ERROR,
                        "Não pode excluir porque existem Sistemas monitorados fazendo referencia para este registro! (FK_SISMON_ACESSO_RESTRITO)");
                return e;
            } else if (msg.indexOf("RULE_229521") >= 0) {
                e = new AdsException("INDQUA.PARAMETROS_CALCULO.RULE_229521.RESTRICTED", 
                        Severity.ERROR,
                        "Não pode excluir porque existem Parâmetros de cálculo fazendo referencia para este registro! (RULE_229521)");
                return e;
            } else if (msg.indexOf("RULE_226363") >= 0) {
                e = new AdsException("INDQUA.INDICADORES_QUALIDADE.RULE_226363.RESTRICTED", 
                        Severity.ERROR,
                        "Não pode excluir porque existem Indicadores de qualidade fazendo referencia para este registro! (RULE_226363)");
                return e;
            } else if (msg.indexOf("FK_AREFUN_FUNSIS_FUNCAO_CONSULTA") >= 0) {
                e = new AdsException("INDQUA.AREAS_FUNCIONAIS.FK_AREFUN_FUNSIS_FUNCAO_CONSULTA.RESTRICTED", 
                        Severity.ERROR,
                        "Não pode excluir porque existem Áreas funcionais fazendo referencia para este registro! (FK_AREFUN_FUNSIS_FUNCAO_CONSULTA)");
                return e;
            } else if (msg.indexOf("FK_FONPES_FUNSIS_ACESSO") >= 0) {
                e = new AdsException("PESQUI.FONTES_PESQUISAS.FK_FONPES_FUNSIS_ACESSO.RESTRICTED", 
                        Severity.ERROR,
                        "Não pode excluir porque existem Fontes de pesquisas fazendo referencia para este registro! (FK_FONPES_FUNSIS_ACESSO)");
                return e;
            } else {
                e = new AdsException("RTSYSINF.FUNCOES_SISTEMAS.GET_ERRORS_UNKNOWN",
                        AdsException.UNKNOWN,
                        "Erro não esperado: " + errorMsg);
            }
        } else {
            if (msg.indexOf("UK_FUNSIS_FUNCAO") >= 0) {
                e = new AdsException("RTSYSINF.FUNCOES_SISTEMAS.UK_FUNSIS_FUNCAO", 
                        Severity.ERROR,
                        "Registro duplicado! Não podem existir duas funções com o mesmo nome! Função ${FUNCAO_SISTEMA} (UK_FUNSIS_FUNCAO)");
                return e;
            } else if (msg.indexOf("UK_FUNSIS_TITULO") >= 0) {
                e = new AdsException("RTSYSINF.FUNCOES_SISTEMAS.UK_FUNSIS_TITULO", 
                        Severity.ERROR,
                        "Registro duplicado! Não podem existir duas funções com o mesmo título! Título ${TITULO} (UK_FUNSIS_TITULO)");
                return e;
            } else if (msg.indexOf("PK_FUNSIS") >= 0) {
                e = new AdsException("RTSYSINF.FUNCOES_SISTEMAS.PK_FUNSIS", 
                        Severity.ERROR,
                        "ID duplicado! (PK_FUNSIS)");
                return e;
            } else {
                e = new AdsException("RTSYSINF.FUNCOES_SISTEMAS.GET_ERRORS_UNKNOWN",
                        AdsException.UNKNOWN,
                        "Erro não esperado: " + errorMsg);
            }
        }
        return e;
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Entity Information">
    
    public String getEntityName() {
        return ENTITY_NAME;
    }
    
    public String getTableName() {
        return TABLE_NAME;
    }
    
    public String idSequenceName() {
        return "PK_SEQUENCE";
    }
    
    private ArrayList<Field> allAttributes;
    public ArrayList<Field> getAllAttributes() {
        if (allAttributes == null) {
            allAttributes = new ArrayList<Field>();
            allAttributes.add(aId);
            allAttributes.add(aFuncaoSistema);
            allAttributes.add(aTitulo);
            allAttributes.add(aDescricao);
        }
        return allAttributes;
    }
    
    /**
     * Retorna o valor da primeira UK da entidade
     * Se ela for composta, retorna a concatenação de toda a combinação
     * de atributos separados por um espaço.
     */
    public String valueOfUk() {
        return getFuncaoSistema().toString();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Relationships">
    
    
    public void findByFuncaoSistema(String funcaoSistema) throws AdsException {
        findBy(new String[] {"FUNCAO_SISTEMA"},
                new Object[] {funcaoSistema});
    }
    
    public void findByTitulo(String titulo) throws AdsException {
        findBy(new String[] {"TITULO"},
                new Object[] {titulo});
    }
    /**
     * Retorna os registros de OPERACOES_FUNCOES que referenciam este registro através do atributo FUNCAO_ID
     */
    public EntOperacoesFuncoes findAllOperacoesFuncoesFuncao() throws AdsException {
        return findAllOperacoesFuncoesFuncao("order by ID");
    }
    
    /**
     * Retorna os registros de OPERACOES_FUNCOES que referenciam este registro através do atributo FUNCAO_ID
     */
    public EntOperacoesFuncoes findAllOperacoesFuncoesFuncao(String sqlAppend) throws AdsException {
        EntOperacoesFuncoes out = new EntOperacoesFuncoes(ctx);
        out.find("select ID from OPERACOES_FUNCOES where FUNCAO_ID = " + valueOfId() + " " + sqlAppend);
        return out;
    }
    
    /**
     * Retorna os registros de INTERFACES_FUNCOES que referenciam este registro através do atributo FUNCAO_ID
     */
    public EntInterfacesFuncoes findAllInterfacesFuncoesFuncao() throws AdsException {
        return findAllInterfacesFuncoesFuncao("order by ID");
    }
    
    /**
     * Retorna os registros de INTERFACES_FUNCOES que referenciam este registro através do atributo FUNCAO_ID
     */
    public EntInterfacesFuncoes findAllInterfacesFuncoesFuncao(String sqlAppend) throws AdsException {
        EntInterfacesFuncoes out = new EntInterfacesFuncoes(ctx);
        out.find("select ID from INTERFACES_FUNCOES where FUNCAO_ID = " + valueOfId() + " " + sqlAppend);
        return out;
    }
    
    /**
     * Retorna os registros de FUNCOES_USUARIOS que referenciam este registro através do atributo FUNCAO_ID
     */
    public EntFuncoesUsuarios findAllFuncoesUsuariosFuncao() throws AdsException {
        return findAllFuncoesUsuariosFuncao("order by ID");
    }
    
    /**
     * Retorna os registros de FUNCOES_USUARIOS que referenciam este registro através do atributo FUNCAO_ID
     */
    public EntFuncoesUsuarios findAllFuncoesUsuariosFuncao(String sqlAppend) throws AdsException {
        EntFuncoesUsuarios out = new EntFuncoesUsuarios(ctx);
        out.find("select ID from FUNCOES_USUARIOS where FUNCAO_ID = " + valueOfId() + " " + sqlAppend);
        return out;
    }
    
    
    /**
     * Método que copia os valores dos atributos
     * para os valores respectivos old 
     */
    public void saveOldAtributes() {
        oDescricao.setValue(aDescricao);
        oId.setValue(aId);
        oTitulo.setValue(aTitulo);
        oFuncaoSistema.setValue(aFuncaoSistema);
    }
    
    /**
     * Método que retorna as regras da entidade
     * @return ArrayList com as regras ou null caso não existir nenhuma regra
     */
    public ArrayList getAllRules() {
        ArrayList<EntityRule> out = new ArrayList<EntityRule>();
        {
            UniqueKeyRule rule = new UniqueKeyRule();
            rule.setEntity(EntFuncoesSistemas.class);
            rule.setName("UK_FUNSIS_FUNCAO");
            rule.addAttribute(new DomUpper("FUNCAO_SISTEMA",""));
            out.add(rule);
        }
        {
            UniqueKeyRule rule = new UniqueKeyRule();
            rule.setEntity(EntFuncoesSistemas.class);
            rule.setName("UK_FUNSIS_TITULO");
            rule.addAttribute(new DomText("TITULO",""));
            out.add(rule);
        }
        {
            PrimaryKeyRule rule = new PrimaryKeyRule();
            rule.setEntity(EntFuncoesSistemas.class);
            rule.setName("PK_FUNSIS");
            rule.setPkAttribute(new DomId("ID",""));
            out.add(rule);
        }
        return out;
    }
    // </editor-fold>
    
    @Override
    public void fillDefaultValues() throws AdsException {
        if (aId.isNull()) {
            aId.setValue("" + ctx.getNextVal("pk_sequence"));
        }
    }
    
    // <editor-fold defaultstate="collapsed" desc="Métodos customizados">
    
    /**
     * Clonar.
     * <p>
     * Cria uma nova função;
     */
    public EntFuncoesSistemas clonar() throws AdsException {
        // <user-code id="3464808" parentId="3464796" hashcode="633511a2" length="542">
        EntFuncoesSistemas clone = new EntFuncoesSistemas(ctx);
        clone.setId(ctx.getNextVal("PK_SEQUENCE"));
        clone.setDescricao(valueOfDescricao());
        clone.setFuncaoSistema(valueOfFuncaoSistema() + "_" + clone.valueOfId());
        clone.setTitulo(valueOfTitulo() + " (copia " + clone.valueOfId() + ")");
        clone.ins();
        EntOperacoesFuncoes oper = new EntOperacoesFuncoes(ctx);
        oper.filterBy().equal(oper.getFuncaoId(), valueOfId());
        while (oper.next()) {
            oper.nullifyId();
            oper.setFuncaoId(clone.valueOfId());
            oper.ins();
        }
        return clone;
        // </user-code>
    }
}
